package com.hyper_yang.javase.multiThread;

public class TryThread {
    /*
    线程常用方法: 【和 Runnable没关系】
        1、获取当前线程的名字 [getName()]
            获取的是线程的默认名字 Thread-0
            在线程类的外部: Thread的静态方法 currentThread().getName()
        2、设置线程的名字:
            在继承的角度:
                使用无参构造器，采用的是默认的线程名
                使用有参构造器，接收 String类型线程名字，super(name);给父类
            在实现的角度:
                Thread(Runnable, String) 使用(线程任务，线程名)的构造器
        3、设置、获得进程优先级: setPriority()、getPriority(),提供一种可能性，优先级高的将获得较多的执行机会
        4、线程休眠: Thread.sleep(1000) 【单位: 毫秒】   main可以抛因为父类是 Object
        5、加入线程: join() 【被 thread.join();的线程会一直等 插队的 thread线程执行完，但是可以指定参数 mills】
            join(): 指定线程插队执行，当前线程等待插队线程执行完毕，再继续执行
            join(x): 指定线程插队执行，当前线程等待执行时间，到达时间后，当前线程继续竞争执行
        6、线程的终止: public final void stop() 强迫线程停止执行，该方法具有不安全性，已被弃用，最好不要使用
            调用 stop()方法会立刻停止 run()方法剩余的全部工作，包括在 catch和 finally语句中的，并抛出 ThreadDeath异常(通常情况下，此异常不需要显示的捕获)
          因此可能会导致一些清理性的工作得不到完成，如文件、数据库等的关闭
            调用 stop()方法会立即释放该线程所持有的所有的锁，导致数据得不到同步，出现数据不一致的问题。
        7、中断线程:
            public void interrupt(): 中断线程，实际上是给线程打上一个中断的标记，并不会真正使线程停止执行。
            public static boolean interrupted(): 检查线程的中断状态，调用此方法会清除终端状态(标记)
            public boolean isInterrupted(): 检查线程的中断状态，调用此方法不会清除终端状态(标记)
     */
    public static void main(String[] args) {

        DogThread dogThread = new DogThread("🐕线程");
        dogThread.start();
        // 提供一种可能性，优先级高的将获得较多的执行机会
        dogThread.setPriority(Thread.MAX_PRIORITY);  // max: 10  normal: 5   min: 1

        Thread catThread = new Thread(new CatRunnable(), "🐱线程");
        catThread.start();

        for (int i = 0; i < 100; i++) {
            if (i % 2 == 1) {
//                Thread.currentThread().stop(); // 官方不推荐
                Thread.currentThread().interrupt();
            }
//            if (Thread.interrupted()) { // 官方推荐自己写逻辑
            if (Thread.currentThread().isInterrupted()) { // 不清除标记，但是效果一样
                System.out.println(Thread.currentThread().getName() + ": 已经被中断");
                return;
            }
            System.out.println(Thread.currentThread().getName() + ":" + i); // main方法不是 Thread类下的 不能 this.getName()
        }

        System.out.println(dogThread.getPriority()); // 5
        System.out.println(catThread.getPriority()); // 5
        System.out.println(Thread.currentThread().getPriority()); // 5
    }
}

class DogThread extends Thread {
    public DogThread() {
        super();
    }

    // todo: 设置名字
    public DogThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++)
            System.out.println(this.getName() + ":" + i);
    }
}

class CatRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++)
            System.out.println(Thread.currentThread().getName() + ":" + i);
    }
}